// 测试String原型上定义的属性和方法

console.log( String.prototype.constructor === String ); // true
console.log( String.prototype.length ); // 0

let s = new String(`hello,kaifamiao.`);
console.log( s, typeof s ); // object
console.log( s.length );
console.log( s.hasOwnProperty( 'length' ) ); // true

let p = s.valueOf();
console.log( p, typeof p ); // string

let x = new String('kaifamiao');
console.log( x.length );
console.log( x.hasOwnProperty( 'length' ) ); // true

// 在变量中存储string类型的原始值(既非对象也无属性的数据)
let y = 'hello';
console.log( y, typeof y ); // hello string
// 首先将string原始值自动包裹到一个String实例中，
// 然后才能通过该String实例的length属性获取字符串长度
console.log( y.length );
// 首先将string原始值自动包裹到一个String实例中，
// 然后才能调用从String.prototype继承的方法
console.log( y.toUpperCase() ); // String.prototype.toUpperCase()
